/**
 * 从数据库中取出数据,并进行分析,然后保存到数据库中
 * Created by zhangsong on 2019-01-18.
 */
const moment = require('moment');
const DbfDAO = require('../dao/dbf');
const config = require('../config/index');
const Cache = require('../common/cache');
const ResultDAO = require('../dao/result');

const DEFAULT = 0;
const LIGHT = 1;
const MODERATE = 2;
const SEVERE = 3;

function choice(date) {
  // 孕穗期 a<now<b
  if (moment(date).isBetween(config.孕穗期.start, config.孕穗期.end)) {
    return fn1;
  }
  // 开花期
  if (moment(date).isBetween(config.开花期.start, config.开花期.end)) {
    return fn2;
  }
  return fn2;
}

// 孕穗期
function fn1(i, arr) {
  if (arr[i] <= 16) { // 第一天温度小于等于16
    if (i > 1 && arr[i - 1] <= 16) { // 第二天温度小于等于16
      if (i > 2 && arr[i - 2] <= 16) { // 第三天温度小于等于16
        return SEVERE;
      } else {
        if (i > 2 && arr[i - 2] <= 17) { // 第三天温度小于等于17
          if (i > 3 && arr[i - 3] <= 17) { // 第四天温度小于等于17
            return SEVERE;
          } else {
            return MODERATE;
          }
        } else { // 只有两天温度小于等于16
          return MODERATE;
        }
      }
    } else if (i > 1 && arr[i - 1] <= 17) { // 第二天温度小于等于17
      if (i > 2 && arr[i - 2] <= 17) { // 第三天温度小于等于17
        if (i > 3 && arr[i - 3] <= 17) { // 第四天温度小于等于17
          return SEVERE;
        } else { // 只有三天温度小于等于17
          return MODERATE;
        }
      } else {
        return LIGHT;
      }
    } else {
      return DEFAULT;
    }
  } else if (arr[i] <= 17) { // 第一天温度小于等于17
    if (i > 1 && arr[i - 1] <= 17) { // 第二天温度小于等于17
      if (i > 2 && arr[i - 2] <= 17) { // 第三天温度小于等于17
        if (i > 3 && arr[i - 3] <= 17) { // 第四天温度小于等于17
          return SEVERE;
        } else { // 只有三天温度小于等于17
          return MODERATE;
        }
      } else { // 只有两天温度小于等于17
        return LIGHT;
      }
    } else {
      return DEFAULT;
    }
  } else {
    return DEFAULT;
  }
}

// 开花期
function fn2(i, arr) {
  if (arr[i] <= 17) { // 第一天温度小于等于17
    if (arr[i - 1] <= 17) { // 第二天温度小于17
      if (arr[i - 2] <= 17) { //连续三天小于等于17
        return SEVERE;
      } else { // 连续两天小于等于17
        return MODERATE;
      }
    } else {
      if (arr[i - 1] <= 18) { // 第二天温度小于等于18
        if (arr[i - 2] <= 18) { // 第三天温度小于18
          if (arr[i - 3] <= 18) { // 第四天温度小于18
            return SEVERE;
          } else {
            if (arr[i - 3] <= 19) {  // 第四天温度小于19
              if (arr[i - 4] <= 19) { // 连续五天温度小于等于19
                return SEVERE;
              } else { // 连续四天温度小于等于19
                return MODERATE;
              }
            } else { // 连续三天温度小于等于18
              return MODERATE;
            }
          }
        } else {
          if (arr[i - 2] <= 19) { // 连续三天小于等于19
            if (arr[i - 3] <= 19) { // 连续四天小于等于19
              if (arr[i - 3] <= 19) { // 连续五天小于等于19
                return SEVERE;
              } else { // 连续四天小于等于19
                return MODERATE;
              }
            } else { // 连续三天小于等于19
              return LIGHT;
            }
          } else { // 连续两天温度小于等于18
            return LIGHT;
          }
        }
      } else { // 第二天温度大于18
        if (arr[i - 1] <= 19) { // 第二天温度小于等于19
          if (arr[i - 2] <= 19) { // 第三天温度小于等于19
            if (arr[i - 3] <= 19) { // 第四天温度小于等于19
              if (arr[i - 4] <= 19) { // 第五天温度小于等于19
                return SEVERE;
              } else { // 第四天温度小于等于19
                return MODERATE;
              }
            } else { // 第三天温度小于等于19
              return LIGHT;
            }
          } else { // 第三天温度大于19
            return DEFAULT;
          }
        } else { // 第二天温度大于19
          return DEFAULT;
        }
      }
    }
  } else if (arr[i] <= 18) { // 第一天温度小于等于18
    if (arr[i - 1] <= 18) { // 第二天温度小于等于18
      if (arr[i - 2] <= 18) { // 第三天温度小于等于18
        if (arr[i - 3] <= 18) { // 第四天温度小于等于18
          return SEVERE;
        } else { // 第四天温度大于18
          return MODERATE;
        }
      } else {
        if (arr[i - 2] <= 19) { // 第三天温度小于等于19
          if (arr[i - 3] <= 19) { // 第四天温度小于等于19
            if (arr[i - 4] <= 19) { // 第五天温度小于等于19
              return SEVERE;
            } else { // 连续四天温度小于等于19
              return MODERATE;
            }
          } else { // 只有三天温度小于等于19
            return LIGHT;
          }
        } else {
          return DEFAULT;
        }
      }
    } else {
      return DEFAULT;
    }
  } else if (arr[i] <= 19) { // 第一天温度小于等于19
    if (arr[i - 1] <= 19) { // 第二天温度小于等于19
      if (arr[i - 2] <= 19) { // 第三天温度小于等于19
        if (arr[i - 3] <= 19) { // 第四天温度小于等于19
          if (arr[i - 4] <= 19) { // 第五天温度小于等于19
            return SEVERE;
          } else { // 只有四天温度小于等于19
            return MODERATE;
          }
        } else { // 只有三天温度小于等于19
          return LIGHT;
        }
      } else { // 只有两天温度小于等于19
        return DEFAULT;
      }
    } else { // 只有一天温度小于等于19
      return DEFAULT;
    }
  } else {
    return DEFAULT;
  }
}

// 对数组进行排序
function sort(arr) {
  arr.sort((a, b) => moment(a.date).valueOf() - moment(b.date).valueOf());
  return arr;
}

const cache = new Cache({
  limit: 100,
  func: async (data) => {
    await ResultDAO.createByMulti(data);
    return null;
  },
});

// 比较生成数据
async function compare(point) {
  return new Promise((resolve, reject) => {
    DbfDAO.findByPoint({
      point,
    }).then((res) => {
      const newArr = sort(res); // 获取到数据,先排序
      const array = newArr.map(i => i.temperature); // 每天的温度
      const list = newArr.map((i, index) => {
        const { date, point } = i;
        const func = choice(date);
        const result = func(index, array);
        return {
          point: point,
          date: date,
          level: result,
        };
      });
      console.log('温度数据:', JSON.stringify(array));
      console.log('结果数据', JSON.stringify(list));
      list.forEach((i) => {
        cache.set(i);
      });
      return resolve();
    }).catch((e) => {
      console.log(e);
      reject(e);
    });
  });
}

(async function main() {
  for (let i = 1; i < 5000000; i++) {
    await compare(i);
  }
})();

